编写智能合约

  • Solidity源文件的布局。
  • 理解Solidity的数据类型。
  • 合约的特殊变量和函数。
  • 控制结构。
  • 合约的结构和功能。
  • 编译和部署合约。

3.1 Solidity源文件

Solidity源文件使用的扩展名为.sol.

pragma Solidity ^0.4.2;//声明编译器版本

3.2 智能合约的结构

  • 状态变量 state variable
  • 函数 function
  • 函数修改器 function modifier
  • 事件 event
  • 结构 structure
  • 枚举 enum
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//contract 关键字声明合约
contract simple{
//state variable
unit256 data; //数据
address owner; //以太坊地址 合约者地址

//event 事件 data发生修改时将触发事件修改器
event logData(unit256 dataToLog)

// function modifier 用于在执行函数之前自动检测条件
// 检测是否合约所有在调用函数。如果不是就抛出异常
modifier onlyOwner() {
if (msg.sender != owner) throw;
}

//constructor 构造函数 用于初始化变量
function Sample(unit256 initData, address initOwner) {
data = initData;
owner = initOwner;
}

//fucnutions
function getData() returns (uint256 returnedData) {
return data;
}

function setData(unit256 newData) onlyOwner {
logData(newData);
data = newData();
}
}

3.3 数据位置

函数参数默认使用memory;
本地变量默认使用storage;

3.4 什么是不同的数据类型

bool
unit8 … unit256
int8 … int256
ufixedOX8 … ufixed0x256 分数
fixed0X8 … fixed0X256

address 最大20字节的值(16进制)存储以太坊地址
address 有两个属性:{
balance
send }

3.4.1 数组类型

支持generic和byte两种数组类型。

3.4.2 字符串类型

两种方法创建字符串 bytes string

string myString = “”;
bytes myRawString;

3.4.3 结构类型

struct

注意: 函数的参数和返回不能使结构类型

3.4.4 枚举类型

enum OS { Windows, Android, MacOX, Linux}

3.4.5 mapping类型

mapping(int => string) myMap;

3.4.6 delete操作符

delete array;
delete struct;

3.4.7 基本类型之间的转换

类型转换注意高位到低位得转换,高位会被丢失,精度不准。

3.4.8 使用var

注意:var不能用于定义数组array和map,也能用于定义函数参数和状态变量。

3.5 控制结构

if…else

3.6 用new操作符创建合约

ContractOne contractOne = new ContractOne();

3.7 异常

throw

3.8 外部函数调用

外部函数调用是指一个函数调用另一个合约的函数。

3.9 合约功能

合约新功能

3.9.1 可见性

函数和状态的默认可见性有四种:
函数的可见性默认为public
状态变量的可见性默认为internal

external
public 可行方法都可以访问
internal 内部访问 继承可以访问 不可以使用this访问
private 私有函数和私有状态变量属于内部函数,继承合约也不可以访问

3.9.2 函数修改器

3.9.3 回退函数

3.9.4 继承

3.10 库

3.11 返回多值

3.12 导入其他Solidity源文件

3.13 全局可用变量

3.14 以太币单位

3.15 存在,真实性和所有权合约的证明

3.16 编译和部署合约

3.17 总结合约